home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / pdftops / goo / c / parseargs < prev   
Text File  |  1996-05-23  |  3KB  |  187 lines

  1. /*
  2.  * parseargs.h
  3.  *
  4.  * Command line argument parser.
  5.  *
  6.  * Copyright 1996 Derek B. Noonburg
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stddef.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include <ctype.h>
  14. #include <parseargs.h>
  15.  
  16. static ArgDesc *findArg(ArgDesc *args, char *arg);
  17. static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]);
  18.  
  19. GBool parseArgs(ArgDesc *args, int *argc, char *argv[]) {
  20.   ArgDesc *arg;
  21.   int i, j;
  22.   GBool ok;
  23.  
  24.   ok = gTrue;
  25.   i = 1;
  26.   while (i < *argc) {
  27.     if (!strcmp(argv[i], "--")) {
  28.       --*argc;
  29.       for (j = i; j < *argc; ++j)
  30.     argv[j] = argv[j+1];
  31.       break;
  32.     } else if ((arg = findArg(args, argv[i]))) {
  33.       if (!grabArg(arg, i, argc, argv))
  34.     ok = gFalse;
  35.     } else {
  36.       ++i;
  37.     }
  38.   }
  39.   return ok;
  40. }
  41.  
  42. void printUsage(char *program, char *otherArgs, ArgDesc *args) {
  43.   ArgDesc *arg;
  44.   int w, w1;
  45.  
  46.   w = 0;
  47.   for (arg = args; arg->arg; ++arg) {
  48.     if ((w1 = strlen(arg->arg)) > w)
  49.       w = w1;
  50.   }
  51.  
  52.   fprintf(stderr, "Usage: %s", program);
  53.   for (arg = args; arg->arg; ++arg) {
  54.     switch (arg->kind) {
  55.     case argFlag:
  56.     case argFlagDummy:
  57.       fprintf(stderr, " [%s]", arg->arg);
  58.       break;
  59.     case argInt:
  60.     case argIntDummy:
  61.       fprintf(stderr, " [%s <int>]", arg->arg);
  62.       break;
  63.     case argFP:
  64.     case argFPDummy:
  65.       fprintf(stderr, " [%s <fp>]", arg->arg);
  66.       break;
  67.     case argString:
  68.     case argStringDummy:
  69.       fprintf(stderr, " [%s <string>]", arg->arg);
  70.       break;
  71.     }
  72.   }
  73.   if (otherArgs)
  74.     fprintf(stderr, " %s", otherArgs);
  75.   fprintf(stderr, "\n");
  76.  
  77.   for (arg = args; arg->arg; ++arg) {
  78.     if (arg->usage)
  79.       fprintf(stderr, "  %-*s: %s\n", w, arg->arg, arg->usage);
  80.   }
  81. }
  82.  
  83. static ArgDesc *findArg(ArgDesc *args, char *arg) {
  84.   ArgDesc *p;
  85.  
  86.   for (p = args; p->arg; ++p) {
  87.     if (p->kind < argFlagDummy && !strcmp(p->arg, arg))
  88.       return p;
  89.   }
  90.   return NULL;
  91. }
  92.  
  93. static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]) {
  94.   int n;
  95.   int j;
  96.   GBool ok;
  97.  
  98.   ok = gTrue;
  99.   n = 0;
  100.   switch (arg->kind) {
  101.   case argFlag:
  102.     *(GBool *)arg->val = gTrue;
  103.     n = 1;
  104.     break;
  105.   case argInt:
  106.     if (i + 1 < *argc && isInt(argv[i+1])) {
  107.       *(int *)arg->val = atoi(argv[i+1]);
  108.       n = 2;
  109.     } else {
  110.       ok = gFalse;
  111.       n = 1;
  112.     }
  113.     break;
  114.   case argFP:
  115.     if (i + 1 < *argc && isFP(argv[i+1])) {
  116.       *(double *)arg->val = atof(argv[i+1]);
  117.       n = 2;
  118.     } else {
  119.       ok = gFalse;
  120.       n = 1;
  121.     }
  122.     break;
  123.   case argString:
  124.     if (i + 1 < *argc) {
  125.       strncpy((char *)arg->val, argv[i+1], arg->size - 1);
  126.       ((char *)arg->val)[arg->size - 1] = '\0';
  127.       n = 2;
  128.     } else {
  129.       ok = gFalse;
  130.       n = 1;
  131.     }
  132.     break;
  133.   default:
  134.     fprintf(stderr, "Internal error in arg table\n");
  135.     n = 1;
  136.     break;
  137.   }
  138.   if (n > 0) {
  139.     *argc -= n;
  140.     for (j = i; j < *argc; ++j)
  141.       argv[j] = argv[j+n];
  142.   }
  143.   return ok;
  144. }
  145.  
  146. GBool isInt(char *s) {
  147.   if (*s == '-' || *s == '+')
  148.     ++s;
  149.   while (isdigit(*s))
  150.     ++s;
  151.   if (*s)
  152.     return gFalse;
  153.   return gTrue;
  154. }
  155.  
  156. GBool isFP(char *s) {
  157.   int n;
  158.  
  159.   if (*s == '-' || *s == '+')
  160.     ++s;
  161.   n = 0;
  162.   while (isdigit(*s)) {
  163.     ++s;
  164.     ++n;
  165.   }
  166.   if (*s == '.')
  167.     ++s;
  168.   while (isdigit(*s)) {
  169.     ++s;
  170.     ++n;
  171.   }
  172.   if (n > 0 && (*s == 'e' || *s == 'E')) {
  173.     ++s;
  174.     if (*s == '-' || *s == '+')
  175.       ++s;
  176.     n = 0;
  177.     if (!isdigit(*s))
  178.       return gFalse;
  179.     do {
  180.       ++s;
  181.     } while (isdigit(*s));
  182.   }
  183.   if (*s)
  184.     return gFalse;
  185.   return gTrue;
  186. }
  187.